#!/usr/bin/env bash
# 使用此脚本在本地开发环境中启动Docker容器作为数据库服务

# Windows系统运行指南:
# 1. 安装WSL (Windows Subsystem for Linux) - https://learn.microsoft.com/en-us/windows/wsl/install
# 2. 安装Docker Desktop for Windows - https://docs.docker.com/docker-for-windows/install/
# 3. 打开WSL终端 - 输入`wsl`命令
# 4. 运行此脚本 - `./start-database.sh`

# 在Linux和macOS系统上可以直接运行此脚本 - `./start-database.sh`

# 定义数据库容器名称
DB_CONTAINER_NAME="gitdiagram-postgres"

# 检查Docker是否已安装
if ! [ -x "$(command -v docker)" ]; then
  echo -e "Docker未安装。请安装Docker后重试。\nDocker安装指南: https://docs.docker.com/engine/install/"
  exit 1
fi

# 检查Docker守护进程是否正在运行
if ! docker info > /dev/null 2>&1; then
  echo "Docker守护进程未运行。请启动Docker后重试。"
  exit 1
fi

# 检查是否已有同名容器正在运行
if [ "$(docker ps -q -f name=$DB_CONTAINER_NAME)" ]; then
  echo "数据库容器'$DB_CONTAINER_NAME'已经在运行中"
  exit 0
fi

# 检查是否存在已停止的同名容器，如果有则启动它
if [ "$(docker ps -q -a -f name=$DB_CONTAINER_NAME)" ]; then
  docker start "$DB_CONTAINER_NAME"
  echo "已启动现有数据库容器'$DB_CONTAINER_NAME'"
  exit 0
fi

# 从.env文件导入环境变量
set -a
source .env

# 从POSTGRES_URL中提取数据库密码和端口
DB_PASSWORD=$(echo "$POSTGRES_URL" | awk -F':' '{print $3}' | awk -F'@' '{print $1}')
DB_PORT=$(echo "$POSTGRES_URL" | awk -F':' '{print $4}' | awk -F'\/' '{print $1}')

# 检查是否使用默认密码，如果是则提示用户更改或生成随机密码
if [ "$DB_PASSWORD" = "password" ]; then
  echo "您正在使用默认数据库密码"
  read -p "是否为您生成随机密码? [y/N]: " -r REPLY
  if ! [[ $REPLY =~ ^[Yy]$ ]]; then
    echo "请在.env文件中更改默认密码后重试"
    exit 1
  fi
  # 生成随机的URL安全密码
  DB_PASSWORD=$(openssl rand -base64 12 | tr '+/' '-_')
  # 在.env文件中替换默认密码
  sed -i -e "s#:password@#:$DB_PASSWORD@#" .env
fi

# 运行Docker容器
docker run -d \
  --name $DB_CONTAINER_NAME \
  -e POSTGRES_USER="postgres" \
  -e POSTGRES_PASSWORD="$DB_PASSWORD" \
  -e POSTGRES_DB=gitdiagram \
  -p "$DB_PORT":5432 \
  docker.io/postgres && echo "数据库容器'$DB_CONTAINER_NAME'已成功创建"
